from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Student,Teacher,Classes
from .serializers import Studentserializers,Teacherserializers,Classesserializers
from rest_framework.status import HTTP_204_NO_CONTENT,HTTP_404_NOT_FOUND
# Create your views here.
'''
    视图集
    list查询全部 create增加 retrieve查询单挑  update修改 destroy删除
'''
# class StudentViewSet(viewsets.ViewSet):
#     def list(self,request):
#         student = Student.objects.all()#得到的是查询集前端不能直接展示
#         serializer = Studentserializers(student,many=True)#将查询集序列化 多条数据要加上many=True
#         return Response(serializer.data)#.data是进行数据展示
#     def create(self,request):
#         #应该拿到前端的数据，数据是在request里，然后反序列化在加入数据库
#         serializer = Studentserializers(data=request.data)
#         #要对数据进行校验is_vaild ,如果校验失败抛出异常成功接着执行
#         serializer.is_valid(raise_exception=True)
#         #拿到数据以后数据是一字典并不能直接使用要拆包
#         serializer.save()
#         #调用save会引用序列化器中的create或者update函数,但是我们要的不是序列化中的create函数所以要从写函数
#         #返回相应
#         return Response(serializer.data)
#     def retrieve(self,request,pk):
#         #获取得到特定的数据 get获取数据如果不存在是会报错(Student.DoesNotExist)的，所以要做异常处理
#         try:
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         #如果查询到数据就进行序列化操作 转化为json格式
#         serializer = Studentserializers(student)
#         return Response(serializer.data)
#
#     def update(self,request,pk):
#         #首先查询出数据
#         try:
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         #反序列化 此处的反序列化要多加一个参数 原因是save操作分两部分，就一个参数执行create多个执行update
#         serializer = Studentserializers(student,data=request.data)
#         #数据校验
#         serializer.is_valid(raise_exception=True)
#         #save 序列化器中的update并不是我们想要的update所以要重写方法
#         serializer.save()
#         return Response(serializer.data)
#     def destroy(self,request,pk):
#         #查询数据是否存在
#         try:
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         #查看源码发现这是模型对象的delete 而且我们只对数据进行逻辑删除所以要重写delete
#         student.delete()
#         return Response(status=HTTP_204_NO_CONTENT)
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.filter(is_delete=False)
    serializer_class = Studentserializers


class ClassesViewSet(viewsets.ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = Classesserializers

    #写好了方法以后要增加路由
    @action(methods=['get'],detail=False)
    # methods表示要用什么方法，detail是要不要带参数False是不带，True是带
    # 如果要添加除了模型办法以外的办法
    def last(self, request):
        # 查询到最后一个数据
        classe = Classes.objects.last()
        # 将数据变成json格式 放映到前端
        return Response(self.get_serializer(classe).data)


class TeacherViewSet(viewsets.ModelViewSet):
    #根据源码可以知道这里执行的删除是真正的删除并不是逻辑删除
    # queryset是特定的字段用其他变量代替
    queryset = Teacher.objects.filter(is_delete=False)
    serializer_class = Teacherserializers





